'use strict';
let { Products, Op } = require('../model');
let products = [
    {
        id: 1,
        productName: 'iPhone 13 Pro 256G 远峰蓝',
        price: 8399,
        stockNum: 500,
        supplier: 'Apple'
    },
    {
        id: 2,
        productName: 'iPhone 13 Pro 256G 远峰蓝',
        price: 8399,
        stockNum: 500,
        supplier: 'Apple'
    },
    {
        id: 3,
        productName: 'iPhone 13 Pro 256G 远峰蓝',
        price: 8399,
        stockNum: 500,
        supplier: 'Apple'
    },
    {
        id: 4,
        productName: 'iPhone 13 Pro 256G 远峰蓝',
        price: 8399,
        stockNum: 500,
        supplier: 'Apple'
    },
    {
        id: 5,
        productName: 'iPhone 13 Pro 256G 远峰蓝',
        price: 8399,
        stockNum: 500,
        supplier: 'Apple'
    },
    {
        id: 6,
        productName: 'iPhone 13 Pro 256G 远峰蓝',
        price: 8399,
        stockNum: 500,
        supplier: 'Apple'
    },
    {
        id: 7,
        productName: 'iPhone 13 Pro 256G 远峰蓝',
        price: 8399,
        stockNum: 500,
        supplier: 'Apple'
    },
]

let fn_list = async (ctx, next) => {
    /*
    总纲：应对查找功能，结合列表，过滤后返回恰当的数据
    1、尝试拿关键字，如果有拿到，则需要进行过滤和查找，返回过滤后的结果；如果没有，则直接返回商品数据
    /product?keyword=XXX 则后台获取参数的形式为：ctx.request.query.keyword

    */
    let keyword = ctx.request.query.keyword || '';
    console.log(keyword.length);
    //判断关键字是否为空
    if (keyword) {
        let list;
        // 查找，需要注意：id、price、stockNum等为数值类型的，需要转换成数值（如果能的话，不能也需要处理成0）再进行比较运算
        list = await Products.findAll({
            where: {
                [Op.or]: [
                    { id: isNaN(keyword) ? 0 : parseInt(keyword) },
                    { productName: keyword },
                    { price: isNaN(keyword) ? 0 : keyword },
                    { stockNum: isNaN(keyword) ? 0 : parseInt(keyword) },
                    { supplier: keyword },
                ]
            },
            order:['id']
        })
        ctx.body = {
            code: 1000,
            data: list,
            msg: '请求成功'
        }
    } else {
        let list = await Products.findAll({
            order:['id']
        });
        ctx.body = {
            code: 1000,
            data: list,
            msg: '请求成功'
        }
    }
}
let fn_getbyid = async (ctx, next) => {
    let id = ctx.request.params.id;
    let product = await Products.findByPk(id);
    if (product) {
        ctx.body = {
            code: 1000,
            data: product,
            msg: '获取指定商品成功'
        }
    } else {
        ctx.body = {
            code: 900,
            data: '',
            msg: '你查找的商品不存在'
        }
    }
}
let fn_post =async (ctx, next) => {
    let obj = ctx.request.body;
    console.log(obj);

    await Products.create(obj);
    ctx.body = obj;
}
// 修改，根据指定id，修改指定的记录；如果没有找到id所代表的记录，则提示不存在
let fn_put =async (ctx, next) => {
    // 获取id
    let id = ctx.request.params.id;
    // 类似post请求，获得传过来的参数
    let obj = ctx.request.body;
    let product = await Products.findByPk(id);
    
    // 如果找到了对应的记录，则进行修改;否则提示查找的记录不存在
    if (product) {
        Products.update(obj,{
            where:{
                id:id
            }
        })
        ctx.body = {
            code: 1000,
            data: product,// 返回修改成功以后的对象
            msg: '修改成功'
        }
    } else {
        ctx.body = {
            code: 900,
            data: '',
            msg: '你所需要修改的商品不存在'
        }
    }
}
let fn_delete =async (ctx, next) => {
    /*
    总纲：拿到id，找出要删除的元素或者记录，然后删除它，返回响应
    1、拿到id，原生页面请求的形式/product/:id 则后台拿到id的形式如下：ctx.request.params.id
    2、根据id删除元素：利用数组的过滤函数，过滤不等于id的所有元素，放在新的数组arr返回，然后将products数组指向返回的新数组arr
    3、响应请求
    */
    let id = ctx.request.params.id;
    console.log(id);
    let product = await Products.findByPk(id);
    // 如果过滤后的数组比原数组长度要小，则说明找到了；反之就是没有找到
    if (product) {
        // products = arr;
        Products.destroy({
            where:{
                id:id
            }
        })
        ctx.body = {
            code: 1000,
            data: { id },
            msg: '删除成功'
        }
    } else {
        ctx.body = {
            code: 400,
            data: null,
            msg: '要删除的元素或者记录不存在，请确认重试。'
        }
    }
}

// restful api
module.exports = {
    'get /product': fn_list,
    'get /product/:id': fn_getbyid,
    'post /product': fn_post,
    'put /product/:id': fn_put,
    'delete /product/:id': fn_delete
}